home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / txf / src / txfbuf.c < prev    next >
C/C++ Source or Header  |  1994-09-17  |  4KB  |  155 lines

  1. /*====================================================================
  2.  *
  3.  * TXF file buffering module
  4.  *
  5.  *====================================================================
  6.  *                                   copyright(C) 1992-1994 T.Nakatani
  7.  *====================================================================
  8.  */
  9. #include "txf.h"
  10. char far *buf_base;
  11. char far *bufrp;
  12. long int bufremain, bufyet, bufldval, bufoffset, buffsize;
  13.  
  14. char far *buffileopen(int i)
  15. {
  16.     char *tmpinname, *tmpoutname;
  17.     struct stat sbuf;
  18.     int rd;
  19.  
  20.     tmpinname = ((tmpinfile == -1) ? inputfile : tfile[tmpinfile]);
  21.     tmpoutname = tfile[((tmpinfile > 0) ? 0 : 1)];
  22.     if (stat(tmpinname, &sbuf) == 0) {
  23.         buffsize = fsize = sbuf.st_size;
  24.     }
  25.     else {
  26.         buffsize = fsize = 0;
  27.     }
  28.  
  29.     if (*tmpinname != NUL) {
  30.         inputh = open(tmpinname, O_RDONLY | O_BINARY);
  31.     }
  32.     else {
  33.         errexit("Cannot open inputfile.");
  34.     }
  35.     outputh = open(tmpoutname, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, S_IWRITE);
  36. #ifdef DEBUG
  37.     if (viewmode > 2) {
  38.         fprintf(stderr, "Info:read=%s(%d),write=%s(%d),tmpinfile=%d\n",
  39.             tmpinname, inputh, tmpoutname, outputh, tmpinfile);
  40.     }
  41. #endif
  42.     if ((inputh == -1) || (outputh == -1)) {
  43.         fprintf(stderr, "Error:cannot open TMP file(%d)\n", i);
  44. #ifdef DEBUG
  45.         fprintf(stderr, "Info:read=%s(%d),write=%s(%d)\n",
  46.             tmpinname, inputh, tmpoutname, outputh);
  47. #endif
  48.         exit(1);
  49.     }
  50.     if ((buf_base = farmalloc(rbufsize+2)) == NULL) {
  51.         rbufsize /= 2;
  52.         if ((buf_base = farmalloc(rbufsize+2)) == NULL) {
  53.             errexit("out of memory.");
  54.         }
  55.     }
  56.     bufremain = bufyet = buffsize;
  57.     bufldval = min(rbufsize-1, bufyet);
  58.     bufoffset = 0;
  59.     if (_dos_read(inputh, buf_base, bufldval, &rd) != 0) {
  60.         errexit("read error");
  61.     }
  62.     bufyet -= rd;
  63.     bufrp = NULL;
  64.     return (buf_base);
  65. }
  66.  
  67. char far *readnext(int val)
  68. {
  69.     unsigned int rd;
  70.     if (bufrp == NULL) {
  71.         bufrp = buf_base;
  72.         if (val > 1) {
  73.             bufrp += (long)val-1;
  74.         }
  75.         bufremain -= val;
  76.     }
  77.     else {
  78.         bufrp += (long)val;
  79.         bufoffset += val;
  80.         bufremain -= val;
  81.         if ((bufoffset > rbufsize-2048) && (bufyet > 0)) {
  82.             far_memcpy(buf_base, buf_base+(long)(rbufsize-4096), 4095);
  83.             bufldval = min(rbufsize-4096, bufyet);
  84.             if (_dos_read(inputh, buf_base+(long)4095, bufldval, &rd) != 0) {
  85.                 errexit("read error");
  86.             }
  87.             bufyet -= rd;
  88.             bufoffset -= rbufsize-4096;
  89.             bufrp = buf_base + (long)bufoffset;
  90.         }
  91.     }
  92.     return (bufrp);
  93. }
  94. #if 0
  95. char *readbefore(int val)
  96. {
  97.     bufrp -= val;
  98.     bufoffset -= val;
  99.     bufremain += val;
  100.     if (bufoffset < 0) {
  101.         if (fseek(input, -(rbufsize>>1), SEEK_CUR) != 0) {
  102.             fseek(input, 0, SEEK_SET);
  103.             bufyet = buffsize;
  104.             bufldval = min(rbufsize-1, bufyet);
  105.             bufyet -= (unsigned long)fread(buf_base, 1, bufldval, input);
  106.             bufoffset = buffsize - bufremain;
  107.             bufrp = buf_base + bufoffset;
  108.         }
  109.         else {
  110.             bufyet += ((rbufsize>>1)+bufldval);
  111.             bufldval = min(rbufsize-1, bufyet);
  112.             bufyet -= fread(buf_base, 1, bufldval, input);
  113.             bufoffset += (rbufsize>>1);
  114.             bufrp = buf_base + bufoffset;
  115.         }
  116.     }
  117.     return (bufrp);
  118. }
  119. #endif
  120.  
  121. long int remainbyte()
  122. {
  123.     return ((bufremain < 0) ? 0 : bufremain);
  124. }
  125.  
  126. void bufclose()
  127. {
  128.     close(inputh);
  129.     close(outputh);
  130.     farfree(buf_base);
  131.     tmpinfile = ((tmpinfile > 0) ? 0 : 1);
  132. #ifdef DEBUG
  133.     if (viewmode > 2) {
  134.         fprintf(stderr, "Info:tmpinfile = %d\n",tmpinfile);
  135.     }
  136. #endif
  137. }
  138.  
  139. int chktouch(char far *rptr, int iy)
  140. {
  141.     if (ishflg) {
  142.         if (ishchk(rptr) > 0) return (1);
  143.     }
  144.     if (quoteflg) {
  145.         if (quotechk(rptr)) {
  146.             return (1);
  147.         }
  148.     }
  149.     if (levelchk(iy)) {
  150.         return (1);
  151.     }
  152.     return (0);
  153. }
  154.  
  155.